﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa una ontología.
    /// </summary>
    public class Ontologia : IEquatable<Ontologia>
    {
        private int idBBDD;
        private string id;
        private EspacioNombres espacioNombresPrincipal;
        private IList<EspacioNombres> espaciosNombres;
        private IList<Clase> clases;
        private IList<Propiedad> propiedadesObjetos;
        private IList<Propiedad> propiedadesDatos;
        private IList<Individuo> individuos;
        private IList<Ontologia> importadas;
        private IList<Problema> problemas;
        private string owl;

        /// <summary>
        /// Id con el que se almacena en la Base de Datos
        /// </summary>
        public virtual int IdBBDD
        {
            get { return idBBDD; }
            set { idBBDD = value; }
        }

        /// <summary>
        /// Id o About del elemento
        /// </summary>
        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        /// <summary>
        /// Espacio de nombres principal de la ontologia
        /// </summary>
        public virtual EspacioNombres EspacioNombresPrincipal
        {
            get { return espacioNombresPrincipal; }
            set { espacioNombresPrincipal = value; }
        }

        /// <summary>
        /// Lista de clases que contiene la ontologia
        /// </summary>
        public virtual IList<Clase> Clases
        {
            get { return clases; }
            set { clases = value; }
        }

        /// <summary>
        /// Lista de propiedades de objetos que contiene la ontologia
        /// </summary>
        public virtual IList<Propiedad> PropiedadesObjetos
        {
            get { return propiedadesObjetos; }
            set { propiedadesObjetos = value; }
        }

        /// <summary>
        /// Lista de propiedades de datos que contiene la ontologia
        /// </summary>
        public virtual IList<Propiedad> PropiedadesDatos
        {
            get { return propiedadesDatos; }
            set { propiedadesDatos = value; }
        }

        /// <summary>
        /// Lista de individuos que contiene la ontologia
        /// </summary>
        public virtual IList<Individuo> Individuos
        {
            get { return individuos; }
            set { individuos = value; }
        }

        /// <summary>
        /// Lista de ontologías importadas que contiene la ontologia
        /// </summary>
        public virtual IList<Ontologia> Importadas
        {
            get { return importadas; }
            set { importadas = value; }
        }

        /// <summary>
        /// Lista de espacios de nombres que contiene la ontologia
        /// </summary>
        public virtual IList<EspacioNombres> EspaciosNombres
        {
            get { return espaciosNombres; }
            set { espaciosNombres = value; }
        }

        /// <summary>
        /// Lista de problemas que se han generado al crear la ontología
        /// </summary>
        public virtual IList<Problema> Problemas
        {
            get { return problemas; }
            set { problemas = value; }
        }

        /// <summary>
        /// OWL de la ontologia
        /// </summary>
        public virtual string Owl
        {
            get { return owl; }
            set { owl = value; }
        }

        public Ontologia() 
        {
            inicializarListas();
        }

        public Ontologia(string id)
        {
            this.id = id;
            inicializarListas();
        }

        /// <summary>
        /// Inicializa las listas de elementos
        /// </summary>
        private void inicializarListas()
        {
            Clases = new List<Clase>();
            PropiedadesObjetos = new List<Propiedad>();
            PropiedadesDatos = new List<Propiedad>();
            Individuos = new List<Individuo>();
            Importadas = new List<Ontologia>();
            EspaciosNombres = new List<EspacioNombres>();
            Problemas = new List<Problema>();
        }

        /// <summary>
        /// Devuelve la lista de clases en un Diccionario
        /// </summary>
        /// <returns>Diccionario de clases</returns>
        public virtual IDictionary<string, Clase> getClasesDictiorary()
        {
            return Clases.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de espacios de nombres en un Diccionario
        /// </summary>
        /// <returns>Diccionario de espacios de nombres</returns>
        public virtual IDictionary<string, EspacioNombres> getEspaciosNombresDictiorary()
        {
            return EspaciosNombres.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de propiedades de objetos en un Diccionario
        /// </summary>
        /// <returns>Diccionario de propiedades de objetos</returns>
        public virtual IDictionary<string, Propiedad> getPropiedadesObjetosDictiorary()
        {
            return PropiedadesObjetos.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de propiedades de tipos en un Diccionario
        /// </summary>
        /// <returns>Diccionario de propiedades de tipos</returns>
        public virtual IDictionary<string, Propiedad> getPropiedadesDatosDictiorary()
        {
            return PropiedadesDatos.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de ontologias importadas en un Diccionario
        /// </summary>
        /// <returns>Diccionario de ontologias importadas</returns>
        public virtual IDictionary<string, Ontologia> getImportadasDictiorary()
        {
            return Importadas.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de individuos en un Diccionario
        /// </summary>
        /// <returns>Diccionario de individuos</returns>
        public virtual IDictionary<string, Individuo> getIndividuosDictiorary()
        {
            return Individuos.ToDictionary(e => e.ToString(), e => e);
        }

        #region Miembros de IEquatable<Ontologia>

        public bool Equals(Ontologia other)
        {
            return EspacioNombresPrincipal.Equals(other.EspacioNombresPrincipal);
        }

        #endregion

        override public String ToString()
        {
            return Id;
        }
    }
}
